/*
 * @Author: 0x9DEFA478
 * @Date: 2024-02-03 15:24:09
 * @LastEditTime: 2024-04-10 21:00:55
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef hH_Invoke_HPP_
#define hH_Invoke_HPP_
#include <functional>




namespace H{

  class DelegateInvokeAbstract{
    public:
      DelegateInvokeAbstract(){}
      virtual ~DelegateInvokeAbstract(){}
      virtual void operator()()=0;
  };
#if __cplusplus >= 202000L
  template<class DI>
  concept is_DelegateInvoke=requires(DI& di){
    di();
  };
#endif

  template<typename T_Invoke,typename... T_Args>
  class DelegateInvoke:public DelegateInvokeAbstract{
    public:
      DelegateInvoke(T_Invoke&& invoke,T_Args&&... args):invoke(std::bind(static_cast<T_Invoke&&>(invoke),static_cast<T_Args&&>(args)...)){}
      ~DelegateInvoke(){}
      static DelegateInvokeAbstract* MakeInvoke(T_Invoke&& invoke,T_Args&&... args){return static_cast<DelegateInvokeAbstract*>(new DelegateInvoke(static_cast<T_Invoke&&>(invoke),static_cast<T_Args&&>(args)...));}
      virtual void operator()()override final{invoke();}
    private:
#if __cplusplus >= 201700L
      using Invoke=std::function<typename std::invoke_result<T_Invoke,T_Args...>::type ()>;
#else
      using Invoke=std::function<typename std::result_of<T_Invoke(T_Args...)>::type ()>;
#endif
      Invoke invoke;
  };

}

#if __cplusplus >= 202000L
  template<class DI>
  concept is_DelegateInvoke=requires(DI& di){
    di();
  };
#endif




#endif //hH_Invoke_HPP_
